import socket
import time
import struct
from config.settings import get_config
from base.base_page import BasePage

class Ntp_Server(BasePage):
    def __init__(self, driver, device_type, logger=None):
        super().__init__(driver, device_type, logger=logger)
        self.driver = driver
        self.config = get_config(device_type)

    def ntp_server(self, host='0.0.0.0', port=123, time_offset=0):
        """
        简易NTP服务器
        :param host: 监听地址（默认所有网卡）
        :param port: 监听端口（默认123，需root权限）
        :param time_offset: 时间偏移量（秒，测试同步纠错）
        """
        # 创建UDP Socket
        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        sock.bind((host, port))
        self.logger.info(f"[*] NTP Server 监听 {host}:{port} (时间偏移: {time_offset}秒)")

        try:
            while True:
                # 接收客户端请求
                data, addr = sock.recvfrom(1024)
                self.logger.info(f"[+] 收到来自 {addr} 的请求")

                # 生成NTP时间戳（当前时间 + 偏移量）
                current_time = time.time() + time_offset
                ntp_time = current_time + 2208988800  # 转换到NTP时间（1900纪元）

                # 构造NTP响应包（简化版）
                # 参考NTP协议格式：https://www.ntp.org/documentation.html
                packet = bytearray(48)
                packet[0] = 0x24  # LI=0（无警告），VN=4（版本4），Mode=4（服务器模式）

                # 写入时间戳
                packet[40:48] = struct.pack('!Q', int(ntp_time * 2**32))

                # 发送响应
                sock.sendto(packet, addr)
                print(f"[+] 响应已发送至 {addr}")

        except KeyboardInterrupt:
            print("\n[*] 服务器关闭")
        finally:
            sock.close()